package cc.rengu.igas.cops.common.dao;

import cc.rengu.oltp.service.common.entity.SignAcctInfo;
import cc.rengu.oltp.utility.bean.PageInfo;
import cc.rengu.oltp.utility.bean.PageResult;
import cc.rengu.oltp.utility.util.DbsUtil;

import java.util.List;

/**
 * @Description 签约信息表操作接口
 * @Author panky
 * @date 2020/5/22
 **/
public interface CopsSignAcctInfoMapper {
    /**
     * 根据 机构号/签约标记类型/签约主体/证件号/账号 获取实体
     *
     * @param instId        机构号
     * @param signTokenType 签约标记类型
     * @param signInst      签约主体
     * @param signType      签约类型
     * @param acctNo        账号
     * @return 实体
     */
    SignAcctInfo selectSignInfoBySignTokenTypeSignInstSignTypeAcctNo(String instId, String signTokenType, String signInst, String signType, String acctNo) throws Exception;

    /**
     * 插入数据
     *
     * @param info 实体
     * @return 操作结果
     */
    int insertSignAcctInfo(SignAcctInfo info) throws Exception;

    /**
     * 插入数据带事务
     *
     * @param info
     * @return
     * @throws Exception
     */
    int insertSignAcctInfoWithTrancation(SignAcctInfo info, DbsUtil dbsUtil) throws Exception;

    /**
     * 根据 机构号/签约主体/卡号 查询
     *
     * @param instId   机构号
     * @param signInst 签约主体
     * @param acctNo   账号
     * @return 集合
     */
    List<SignAcctInfo> selectSignAcctInfoBySignInstAcctNo(String instId, String signInst, String acctNo) throws Exception;

    /**
     * 根据 机构号/签约主体/签约类型/账号 查询
     *
     * @param instId   机构号
     * @param signInst 签约主体
     * @param signType 签约类型
     * @param acctNo   账号
     * @return 集合
     * @throws Exception 异常
     */
    List<SignAcctInfo> selectSignAcctInfoBySignInstSignTypeAcctNo(String instId, String signInst, String signType, String acctNo) throws Exception;

    /**
     * 根据 机构号/签约主体/证件类型/证件号码 查询
     *
     * @param instId   机构号
     * @param signInst 签约主体
     * @param certType 证件类型
     * @param certNo   证件号码
     * @return 集合
     */
    List<SignAcctInfo> selectSignAcctInfoBySingInstCertTypeCertNo(String instId, String signInst, String certType, String certNo) throws Exception;

    /**
     * 根据 机构号/签约主体/银行预留手机号 查询
     *
     * @param instId         机构号
     * @param signInst       签约主体
     * @param reservePhoneNo 银行预留手机号
     * @return 集合
     */
    List<SignAcctInfo> selectSignAcctInfoBySignInstReservePhoneNo(String instId, String signInst, String reservePhoneNo) throws Exception;

    /**
     * 根据 机构号/签约账号 查询可用的签约关系
     *
     * @param instId     机构号
     * @param signAcctNo 签约账号
     * @return 集合
     */
    List<SignAcctInfo> selectSignAcctInfoBySignAcctNo(String instId, String signAcctNo) throws Exception;

    /**
     * 更新签约信息表 - 无事务
     *
     * @param signAcctInfo 签约实体
     * @param dbs          数据库连接
     * @return 操作结果
     */
    int updateSignAcctInfoByPriKeyNoTransaction(SignAcctInfo signAcctInfo, DbsUtil dbs) throws Exception;

    /**
     * 更新签约信息表 - 无事务
     *
     * @param signAcctInfo 签约实体
     * @return 操作结果
     */
    int updateSignAcctInfoByPriKey(SignAcctInfo signAcctInfo) throws Exception;

    /**
     * 根据 机构号/签约主体/核心客户号 查询
     *
     * @param instId   机构号
     * @param signInst 签约主体
     * @param userId   核心客户号
     * @return 集合
     */
    List<SignAcctInfo> selectSignAcctInfoByUserId(String instId, String signInst, String userId) throws Exception;

    /**
     * 根据 机构号/签约标记类型/签约主体/证件号/账号 更新签约信息 String instId, String tokenType, String signInst, String bankSign, String draweeAcct
     *
     * @param signAcctInfo
     * @return
     */
    int updateSignAcctInfoBySignTokenTypeSignInstSignTypeAcctNo(SignAcctInfo signAcctInfo) throws Exception;

    /**
     * 查询账户签约信息
     *
     * @param instId
     * @param certType
     * @param certNo
     * @param cardNo
     * @param signStatus
     * @param startDate
     * @param endDate
     * @param pageInfo
     * @return
     */
    PageResult selectAcctSignInfoByNotNullParams(String instId, String certType, String certNo, String cardNo, String signStatus, String startDate, String endDate, PageInfo pageInfo) throws Exception;

    /**
     * 根据机构号，证件类型，证件号码查询签约账户信息
     *
     * @param instId
     * @param certType
     * @param certNo
     * @return
     * @throws Exception
     */
    List<SignAcctInfo> selectSignAcctInfoByInstIdCertTypeCertNo(String instId, String certType, String certNo) throws Exception;

    /**
     * 更新签约信息表解约状态及日期
     *
     * @param signAcctInfo
     * @param dbsUtil
     * @return
     */
    int updateSignAcctInfoByPriKeyWithTransaction(SignAcctInfo signAcctInfo, DbsUtil dbsUtil) throws Exception;

    /**
     * 更新卡在签约信息表中所有记录状态（柜面调用卡解约交易使用，其他交易慎用）
     *
     * @param signAcctInfo 签约卡信息
     * @return
     * @throws Exception
     */
    int updateSignStateBySignAcct(SignAcctInfo signAcctInfo) throws Exception;
}
